Shader "Custom/WaterShader" {
    // 属性块：定义可在Inspector面板中调整的参数
    Properties {
        _Color ("水面颜色", Color) = (0.2, 0.5, 0.8, 0.8) // 水面的基本颜色，包含透明度
        _WaveHeight ("波浪高度", Range(0.01, 1.0)) = 0.2 // 控制波浪起伏的高度
        _WaveSpeed ("波浪速度", Range(0.1, 5.0)) = 1.5 // 控制波浪动画的速度
        _WaveFrequency ("波浪频率", Range(1, 20)) = 5 // 控制波浪的密集程度
        _MainTex ("法线贴图", 2D) = "bump" {} // 用于模拟水面法线细节的纹理
        _NormalScale ("法线强度", Range(0.1, 2.0)) = 1.0 // 控制法线贴图对水面外观的影响强度

        _ReflectionStrength ("反射强度", Range(0, 1)) = 0.5 // 控制水面反射效果的强度
    }

    // 子着色器：包含实际的渲染逻辑
    SubShader {
        // 标签：设置渲染队列和渲染类型
        Tags { "Queue"="Transparent" "RenderType"="Transparent" "IgnoreProjector"="True" }
        LOD 100

        // 混合模式：设置透明混合
        Blend SrcAlpha OneMinusSrcAlpha
        // 关闭深度写入，确保透明物体正确渲染
        ZWrite Off

        // 通道：包含顶点和片段着色器
        Pass {
            CGPROGRAM
            // 定义顶点着色器和片段着色器的入口函数
            #pragma vertex vert
            #pragma fragment frag

            // 包含Unity的CG函数库
            #include "UnityCG.cginc"

            // 声明属性变量，使其在CG代码中可用
            float4 _Color;
            float _WaveHeight;
            float _WaveSpeed;
            float _WaveFrequency;
            sampler2D _MainTex;
              float4 _MainTex_ST;
              float _NormalScale;

            float _ReflectionStrength;

            // 定义顶点输入结构
            struct appdata {
                float4 vertex : POSITION; // 顶点位置
                float2 uv : TEXCOORD0; // UV坐标
                float3 normal : NORMAL; // 法线方向
            };

            // 定义顶点输出结构
            struct v2f {
                float2 uv : TEXCOORD0; // UV坐标，传递给片段着色器
                float4 pos : SV_POSITION; // 裁剪空间位置
                float3 worldPos : TEXCOORD1; // 世界空间位置
                float3 worldNormal : TEXCOORD2; // 世界空间法线
            };

            // 顶点着色器函数
            v2f vert (appdata v) {
                v2f o;
                // 计算波浪动画：使用正弦函数创建上下起伏效果
                float wave = sin(v.vertex.x * _WaveFrequency + _Time.y * _WaveSpeed) * _WaveHeight;
                // 应用波浪位移到顶点位置
                v.vertex.y += wave;
                // 将顶点位置从模型空间转换到裁剪空间
                o.pos = UnityObjectToClipPos(v.vertex);
                // 传递UV坐标，并应用纹理缩放和平移
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                // 计算世界空间位置
                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
                // 计算世界空间法线
                o.worldNormal = UnityObjectToWorldNormal(v.normal);
                return o;
            }

            // 片段着色器函数
            fixed4 frag (v2f i) : SV_Target {
                // 采样法线贴图
                float3 normal = UnpackNormal(tex2D(_MainTex, i.uv + _Time.y * 0.1));
                // 缩放法线强度
                normal.xy *= _NormalScale;
                // 归一化法线向量
                normal = normalize(normal);

                // 计算视角方向
                float3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
                // 计算反射方向
                float3 reflectDir = reflect(-viewDir, normal);
                // 采样环境反射
                float4 reflection = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, reflectDir);
                // 解码HDR反射颜色
                reflection.rgb = DecodeHDR(reflection, unity_SpecCube0_HDR);

                // 计算漫反射颜色
                float3 diffuse = _Color.rgb * max(0, dot(normal, float3(0, 1, 0)));
                // 混合漫反射和反射颜色
                float3 col = lerp(diffuse, reflection.rgb, _ReflectionStrength);

                // 返回最终颜色，包含透明度
                return float4(col, _Color.a);
            }
            ENDCG
        }
    }
    // 后备着色器：当硬件不支持当前着色器时使用
    FallBack "Diffuse"
}